// 引入阿里云 OSS SDK
const OSS = require("ali-oss");
// 引入配置文件
const config = require("./config.json");
// 引入 fs 和 path 模块
const fs = require("fs");
const path = require("path");
// 引入 node-cron 模块
const cron = require('node-cron');

// 创建 OSS 客户端实例
const client = new OSS({
  accessKeyId: config.accessKeyId, // 访问密钥 ID
  accessKeySecret: config.accessKeySecret, // 访问密钥 Secret
  bucket: config.bucket, // 存储桶名称
  region: config.region // 区域
});

// 在最外层定义初始数据,使得所有函数里面都可以使用,不用传来传去, 不是什么优雅实现
let successCount = 0;
let failCount = 0;
let startTime = new Date().getTime();
let endTime = new Date().getTime();
let uploadTime = endTime - startTime;

// 主函数
function run(dir) {
  // 定义 loger 函数，用于将上传日志添加到 backup-log 文件中
  function loger() {
    fs.appendFileSync(
      "backup-log",
      `上传于 ${formatDate(
        new Date()
      )}: ${successCount} 文件上传成功，${failCount} 文件上传失败，耗时 ${uploadTime}ms。\n`
    );
  }
  
  // 定义 action 函数，用于执行上传文件的操作
  function action() {
    // 初始化上传成功和上传失败的文件数量
    successCount = 0;
    failCount = 0;
    // 获取当前时间戳
    startTime = new Date().getTime();
    endTime = new Date().getTime();
    // 计算上传耗时
    uploadTime = endTime - startTime;
    // 调用 uploadDbFiles 函数，上传指定目录下的文件
    uploadDbFiles(dir);
    // 调用 loger 函数，记录上传日志
    loger();
  }

  // 调用 action 函数，执行上传文件的操作
  action()

  // 每两小时执行一次
  cron.schedule('0 */2 * * *', () => {
    action()
  });



}

// 递归遍历目录并上传 .db 文件
function uploadDbFiles(dir) {
  const files = fs.readdirSync(dir);
  for (const file of files) {
    const filePath = path.join(dir, file);
    const stat = fs.statSync(filePath);

    if (stat.isDirectory()) {
      // 递归遍历子目录
      uploadDbFiles(filePath);
    } else if (path.extname(file) === ".db" || path.extname(file) === ".sqlite3") {
      // 上传 .db 文件
      const ossPath = path.relative(process.cwd(), filePath);
      try {
        // TODO 喵的, 忘记这里异步难搞就直接放了, 现在没有成功与否的判断, 后续再补
        client.put(ossPath, filePath);
        console.log(`Uploaded ${filePath} to ${ossPath}`);
        successCount++;
      } catch (err) {
        console.error(`Error uploading ${filePath}:`, err);
        failCount++;
      }
    }
  }
}

function formatDate(date) {
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, "0");
  const day = String(date.getDate()).padStart(2, "0");
  const hour = String(date.getHours()).padStart(2, "0");
  const minute = String(date.getMinutes()).padStart(2, "0");
  return `${year}-${month}-${day} ${hour}:${minute}`;
}


// 暴露backupUtil函数作为备份功能函数，供其他文件调用
module.exports = {
  run
}
